!  Generic HSDPA
!
!	Author:	Ross Barkman
!
!	History:
!		06 Apr 01	First release of base script
!		30 Dec 02	Configured for generic GPRS settings
!		29 Jun 03	Allow three tries at response test
!		15 Mar 04	Serial speed increased for UMTS, APN check added
!		01 Sep 04	Add connect speed report for 384000 & 460800
!		12 Mar 05	Add PIN processing section
!		06 Nov 06	Increase speed for HSDPA
!
!
!  'mlts' resource info:
!    byte 1 == 01 -> modem HAS built-in error correction protocols
!    byte 2 == 01 -> modem HAS built-in data compression protocols
!    byte 3 == 200 -> max number of chars in varstr 7
!    byte 4 == 200 -> max number of chars in varstr 8
!    byte 5 == 200 -> max number of chars in varstr 9
!	
@ORIGINATE
@ANSWER
!
note "Generic HSDPA CID1 with PIN" 1
!
!	Check APN
!
!	Common mistake: using *99 instead of APN
!
ifstr 1 110 "*99#"
ifstr 1 110 "*98#"
ifstr 1 110 "*99***1#"
ifstr 1 110 "*99***2#"
ifstr 1 110 "*99***3#"
ifstr 1 110 "*99***4#"
ifstr 1 110 "*99***5#"
ifstr 1 110 "*99***6#"
ifstr 1 110 "*99***7#"
ifstr 1 110 "*99***8#"
ifstr 1 110 "*99***9#"
ifstr 1 110 "*99***10#"
!
! ---- Modem setup ----
!
! Set serial port speed 1843200, all interface signals off
! 
serreset 1843200, 0, 8, 1
hsreset 0 0 0 0 0 0
settries 0
!
! Check the phone is responding
!
@LABEL 1
matchclr
matchstr 1 2 "OK\13\10"
write "AT\13"
matchread 30
inctries
iftries 3 101
jsr 9
jump 1
!
!
@LABEL 2
!
settries 0
!
! Manufacturer check - not used
!
!matchclr
!matchstr 1 3  "<manufacturer>"
!write "AT+CGMI\13"
!matchread 60
!jump 109
!
!
@LABEL 3
!
! Configure the phone
!
matchclr
matchstr 1 4   "OK\13\10"
matchstr 2 101 "ERROR\13\10"
write "AT&FE0V1S0=0\13"
matchread 30
inctries
iftries 3 101
jsr 9
jump 3
!
!
@LABEL 4
!
! Begin SIM unlock
!
pause 10
settries 0
!
!
@LABEL 5
!
! Check SIM lock state
!
matchclr
matchstr 1 10  "READY\13\10"
matchstr 2 6   "SIM PIN\13\10"
matchstr 3 111 "ERROR"
write "AT+CPIN?\13"
matchread 60
jump 111
!
!
@LABEL 6
!
! Unlock SIM
!
inctries
iftries 4 101
!
ask 0 "Enter PIN for card SIM: " 107
!
matchclr
matchstr 1 5   "OK\13\10"
matchstr 2 111 "ERROR\13\10"
write "AT+CPIN=^*\13"
matchread 60
jump 6
!
!
@LABEL 9
!
! Subroutine: Attempt to reset the phone
!
DTRClear
pause 5
DTRSet
flush
return
!
!
@LABEL 10
pause 10
settries 0
!
!
@LABEL 11
!
! Set additional options
!
matchclr
matchstr 1 19  "OK\13\10"
matchstr 2 108 "ERROR\13\10"
!
! Check Access Point Name stored in dialstring (VarString 1)
! If APN is set to None, ignore it
!
ifstr 1 12 "None"
ifstr 1 12 "none"
ifstr 1 12 "NONE"
!
!	Set APN using +CGDCONT=1,"IP","<APN>"
!
write "AT+CGDCONT=1,\34IP\34,\34^1\34\13"
jump 13
!
!
@LABEL 12
!
!	No APN
!
write "AT\13"
!
!
@LABEL 13
matchread 60
inctries
iftries 3 101
jump 11
!
!
@LABEL 19
! 
! Setup complete
!
ifANSWER 32
!
!
! ---- Place a call ----
!
@LABEL 20
!
!
note "Making 3G connection" 3
write "ATD*99***1#\13"
!
!
! ---- Connect response ----
!
! Parses successful connect responses in the following format:
!   CARRIER xxxxx
!	PROTOCOL: ppp
!	COMPRESSION: ccc
!   CONNECT zzzzz
!
@LABEL 32
matchclr
matchstr  1 81  "RING\13\10"
matchstr  2 102 "NO DIALTONE\13\10"
matchstr  3 103 "NO CARRIER"
matchstr  4 103 "ERROR\13\10"
matchstr  5 104 "BUSY\13\10"
matchstr  6 105 "NO ANSWER\13\10"
matchstr  7 34  "CARRIER"
matchstr  8 34  "CONNECT"
matchstr  9 61  "PROTOCOL"
matchstr 10 66  "COMPRESSION"
matchread 700
ifANSWER 32
jump 105
!
!
!  CARRIER/CONNECT parsing
!
@LABEL 34
!
!    2400, 4800 and 34800 have three entries each
!    to distinguish them from 24000, 48000 and 384000
!
matchclr
matchstr  1 40 "2400\13"
matchstr  2 40 "2400/"
matchstr  3 40 "2400 "
matchstr  4 41 "4800\13"
matchstr  5 41 "4800/"
matchstr  6 41 "4800 "
matchstr  7 42 "7200"
matchstr  8 43 "9600"
matchstr  9 44 "12000"
matchstr 10 45 "14400"
matchstr 11 46 "19200"
matchstr 12 51 "28800"
matchstr 13 52 "38400\13"
matchstr 14 52 "38400/"
matchstr 15 52 "38400 "
matchstr 16 53 "57600"
matchstr 17 54 "115200"
matchstr 18 55 "230400"
matchstr 19 56 "384000"
matchstr 20 57 "460800"
matchread 10
jump 59
!
! -- Connection rates --
!
! CommunicatingAt informs ARA of the link speed
!
@LABEL 40
note "Communicating at 2400 bps." 2
CommunicatingAt 2400
jump 60
!
@LABEL 41
note "Communicating at 4800 bps." 2
CommunicatingAt 4800
jump 60
!
@LABEL 42
note "Communicating at 7200 bps." 2
CommunicatingAt 7200
jump 60
!
@LABEL 43
note "Communicating at 9600 bps." 2
CommunicatingAt 9600
jump 60
!
@LABEL 44
note "Communicating at 12400 bps." 2
CommunicatingAt 12400
jump 60
!
@LABEL 45
note "Communicating at 14400 bps." 2
CommunicatingAt 14400
jump 60
!
@LABEL 46
note "Communicating at 19200 bps." 2
CommunicatingAt 19200
jump 60
!
@LABEL 51
note "Communicating at 28800 bps." 2
CommunicatingAt 28800
jump 60
!
@LABEL 52
note "Communicating at 38400 bps." 2
CommunicatingAt 38400
jump 60
!
@LABEL 53
note "Communicating at 57600 bps." 2
CommunicatingAt 57600
jump 60
!
@LABEL 54
note "Communicating at 115200 bps." 2
CommunicatingAt 115200
jump 60
!
@LABEL 55
note "Communicating at 230400 bps." 2
CommunicatingAt 230400
jump 60
!
@LABEL 56
note "Communicating at 384000 bps." 2
CommunicatingAt 384000
jump 60
!
@LABEL 57
note "Communicating at 460800 bps." 2
CommunicatingAt 460800
jump 60
!
@LABEL 59
note "Communicating at an unknown rate." 2
!
@LABEL 60
jump 70
!
! -- PROTOCOL parsing --
!
! Userhook 2 informs ARA that a modem-to-modem error
! correcting protocol has been negotiated
!
@LABEL 61
matchclr
matchstr  1 63 "NONE"
matchstr  2 62 "LAPM"
matchstr  3 62 "ALT"
matchstr  4 63 "\13"
matchread 10
jump 63
!
@LABEL 62
note "Modem Reliable Link Established." 2
userhook 2
!
@LABEL 63
jump 32
!
! -- COMPRESSION parsing --
!
! Userhook 3 informs ARA that a modem-to-modem compression
! protocol has been negotiated
!
@LABEL 66
matchclr
matchstr  1 68 "NONE"
matchstr  2 67 "V42B"
matchstr  3 67 "MNP5"
matchstr  4 68 "\13"
matchread 10
jump 68
!
@LABEL 67
note "Modem Compression Established." 2
userhook 3
!
@LABEL 68
jump 32
!
!
! -- Normal exit after "CONNECT" --
!
!
@LABEL 70
!
! Turn CTS on, for hardware flow control
!
HSReset 0 1 0 0 0 0
!
ifANSWER 71
pause 30
!
@LABEL 71
exit 0
!
!
! ---- Answer calls ----
!
!	A RING result from the modem and in ANSWERING mode
!	claims the serial port and answering the phone
!
@LABEL 81
ifORIGINATE 32
userhook 1
note "Answering phone..." 2
write "ATA\13"
jump 32
!
!
! ---- Hang up and reset modem ----
!
@HANGUP
@LABEL 90
settries 0
HSReset 0 0 0 0 0 0
!
@LABEL 92
!
!  Escape from data to command mode
!
matchclr
matchstr 1 94 "OK\13\10"
pause 11
write "+++"
matchread 20
!
@LABEL 94
!
! Send hangup command
!
pause 10
matchclr
matchstr 1 98 "NO CARRIER\13\10"
matchstr 2 98 "OK\13\10"
matchstr 3 98 "ERROR\13\10"
matchstr 4 98 "0\13\10"
write "ATH0\13"
matchread 30
! 
! If that fails, toggle DTR
!
DTRClear
pause 5
DTRSet
flush
!
! Try this three times only
!
inctries
iftries 3 101
jump 92
!
!
@LABEL 98
!
! Reset phone to default settings
!
pause 10
matchclr
matchstr 1 99 "OK\13\10"
write "AT&F\13"
matchread 30
jump 101
!
@LABEL 99
exit 0
!
! ---- Error messages -----
!
! Modem Not Responding
@LABEL 101
exit -6019
!
! No Dial Tone
@LABEL 102
exit -6020
!
! No Carrier or Error
@LABEL 103
exit -6021
!
! Busy
@LABEL 104
exit -6022
!
! No Answer
@LABEL 105
exit -6023
!
! User Cancellation
@LABEL 107
exit -6008
!
@LABEL 108
note "The phone or network does not seem to support the GPRS options required for this script" 1
ask 2 "The phone or network does not seem to support the GPRS options required for this script"
exit -6002
!
@LABEL 109
note "This script is only suitable for xxxxx" 1
ask 2 "This script is only suitable for xxxxxx"
exit -6002
!
@LABEL 110
note "DO NOT put *99... in the telephone number - use the Access Point Name (APN) for your network instead" 1
ask 2 "DO NOT put *99... in the telephone number - use the Access Point Name (APN) for your network instead"
exit -6002
!
@LABEL 111
note "The card does not seem to support the PIN commands required for this script, or requires more extensive unlocking (e.g. PUK codes)" 1
ask 2 "The card does not seem to support the PIN commands required for this script, or requires more extensive unlocking (e.g. PUK codes)"
exit -6002
